"""
状态管理器使用示例

本文件演示了如何在应用中使用状态管理器来处理各种状态更新和监听。
"""

from app.services.service_locator import ServiceLocator
from app.state.app_state_manager import AppStateManager
from app.state.state_types import StateType, StateValues
from app.utils.logger import Logger

class StateManagerUsageExample:
    """
    状态管理器使用示例类
    """
    
    def __init__(self):
        """
        初始化示例类
        """
        # 获取日志记录器
        self.logger = Logger.get_logger("state_manager_example")
        
        # 获取状态管理器实例
        self.state_manager = ServiceLocator.get(AppStateManager)
        if not self.state_manager:
            self.logger.error("无法获取状态管理器")
            return
        
        # 注册状态监听器
        self._register_state_listeners()
        
    def _register_state_listeners(self):
        """
        注册状态监听器
        """
        # 注册连接状态监听器
        self.state_manager.add_listener(StateType.CONNECTION, self._on_connection_state_changed)
        
        # 注册音频服务状态监听器
        self.state_manager.add_listener(StateType.AUDIO_SERVICE, self._on_audio_service_state_changed)
        
        # 注册AI服务状态监听器
        self.state_manager.add_listener(StateType.AI_SERVICE, self._on_ai_service_state_changed)
        
        # 注册播放状态监听器
        self.state_manager.add_listener(StateType.PLAYBACK, self._on_playback_state_changed)
        
        self.logger.info("状态监听器注册完成")
        
    def _on_connection_state_changed(self, state_type, value):
        """
        处理连接状态变更
        
        @param state_type: 状态类型
        @param value: 状态值
        """
        self.logger.info(f"连接状态变更: {value}")
        
        # 根据连接状态执行操作
        if value == StateValues.CONNECTED:
            self.logger.info("连接已建立，执行相关操作...")
            # 启用相关UI控件
            # 开始数据流处理
        elif value == StateValues.CONNECTING:
            self.logger.info("正在连接，显示连接中状态...")
            # 显示连接进度或旋转图标
        else:
            self.logger.info("连接已断开，执行断开连接操作...")
            # 禁用相关UI控件
            # 停止数据流处理
            
    def _on_audio_service_state_changed(self, state_type, value):
        """
        处理音频服务状态变更
        
        @param state_type: 状态类型
        @param value: 状态值
        """
        self.logger.info(f"音频服务状态变更: {value}")
        
        if value == StateValues.CONNECTED:
            self.logger.info("音频服务已连接，启用音频相关功能...")
            # 启用音频播放控件
            # 更新UI显示音频服务已连接
        else:
            self.logger.info("音频服务已断开，禁用音频相关功能...")
            # 禁用音频播放控件
            # 显示音频服务错误提示
    
    def _on_ai_service_state_changed(self, state_type, value):
        """
        处理AI服务状态变更
        
        @param state_type: 状态类型
        @param value: 状态值
        """
        self.logger.info(f"AI服务状态变更: {value}")
        
        if value == StateValues.CONNECTED:
            self.logger.info("AI服务已连接，启用AI相关功能...")
            # 启用AI分析控件
        else:
            self.logger.info("AI服务已断开，禁用AI相关功能...")
            # 禁用AI分析控件
    
    def _on_playback_state_changed(self, state_type, value):
        """
        处理播放状态变更
        
        @param state_type: 状态类型
        @param value: 状态值
        """
        self.logger.info(f"播放状态变更: {value}")
        
        if value == StateValues.PLAYING:
            self.logger.info("正在播放，更新UI显示...")
            # 更新UI控件显示播放状态
            # 更新播放按钮为暂停图标
        elif value == StateValues.PAUSED:
            self.logger.info("播放已暂停，更新UI显示...")
            # 更新UI控件显示暂停状态
            # 更新播放按钮为播放图标
        elif value == StateValues.STOPPED:
            self.logger.info("播放已停止，更新UI显示...")
            # 重置播放UI
            # 重置播放按钮为播放图标
        
    def update_connection_state(self, is_connected):
        """
        更新连接状态
        
        @param is_connected: 是否已连接
        """
        # 设置连接状态
        state_value = StateValues.CONNECTED if is_connected else StateValues.DISCONNECTED
        self.state_manager.set_state(StateType.CONNECTION, state_value)
        self.logger.info(f"已设置连接状态: {state_value}")
        
    def update_audio_service_state(self, is_connected):
        """
        更新音频服务状态
        
        @param is_connected: 是否已连接
        """
        # 设置音频服务状态
        state_value = StateValues.CONNECTED if is_connected else StateValues.DISCONNECTED
        self.state_manager.set_state(StateType.AUDIO_SERVICE, state_value)
        self.logger.info(f"已设置音频服务状态: {state_value}")
        
    def update_playback_state(self, is_playing):
        """
        更新播放状态
        
        @param is_playing: 是否正在播放
        """
        # 设置播放状态
        state_value = StateValues.PLAYING if is_playing else StateValues.STOPPED
        self.state_manager.set_state(StateType.PLAYBACK, state_value)
        self.logger.info(f"已设置播放状态: {state_value}")
        
    def demonstrate_usage(self):
        """
        演示状态管理器的使用
        """
        self.logger.info("开始演示状态管理器使用...")
        
        # 演示设置和获取状态
        self.logger.info("1. 设置连接状态为已连接")
        self.state_manager.set_state(StateType.CONNECTION, StateValues.CONNECTED)
        
        current_connection_state = self.state_manager.get_state(StateType.CONNECTION)
        self.logger.info(f"当前连接状态: {current_connection_state}")
        
        # 演示状态历史
        self.logger.info("2. 检查连接状态历史")
        connection_history = self.state_manager.get_state_history(StateType.CONNECTION)
        self.logger.info(f"连接状态历史: {connection_history}")
        
        # 演示状态变更
        self.logger.info("3. 演示状态变更")
        self.logger.info("设置音频服务状态为已连接")
        self.state_manager.set_state(StateType.AUDIO_SERVICE, StateValues.CONNECTED)
        
        self.logger.info("设置音频服务状态为未连接")
        self.state_manager.set_state(StateType.AUDIO_SERVICE, StateValues.DISCONNECTED)
        
        self.logger.info("设置播放状态为播放中")
        self.state_manager.set_state(StateType.PLAYBACK, StateValues.PLAYING)
        
        self.logger.info("设置播放状态为已暂停")
        self.state_manager.set_state(StateType.PLAYBACK, StateValues.PAUSED)
        
        # 演示移除监听器
        self.logger.info("4. 移除连接状态监听器")
        self.state_manager.remove_listener(StateType.CONNECTION, self._on_connection_state_changed)
        
        self.logger.info("演示完成")


def run_example():
    """
    运行示例
    """
    # 确保状态管理器已初始化（一般在应用启动时进行）
    ServiceLocator.initialize()
    
    # 创建示例类实例
    example = StateManagerUsageExample()
    
    # 运行演示
    example.demonstrate_usage()
    
    # 清理（释放资源）
    logger = Logger.get_logger("state_manager_example")
    logger.info("清理状态管理器资源")
    ServiceLocator.clear()


if __name__ == "__main__":
    run_example() 